今天預計將 Required 的部分處理完畢!
目前 getAllStoredRecords
的功能,只是透過 Alert 顯示儲存的訊息而已,並沒有處理到訊息輸出的部分。讓我們修改如下:
export const getAllStoredRecords = async () => {
const keys = await getAllKeys();
const records = await Promise.all(
keys.map(async key => {
const value = await getData(key);
return {key, value};
}),
);
const formattedRecords = JSON.stringify(records);
return formattedRecords;
};
筆者調查了以後,發現 React Native 提供的 Share
API 可以達成我們外部輸出的需求。
錯誤
:export const shareStoredRecords = async () => {
const message = await getAllStoredRecords();
try {
await Share.share({
message,
});
} catch (error) {
console.error(error.message);
}
};
看了一下型別,確定我們沒有帶錯:
export type ShareContent =
| {
title?: string | undefined;
message: string;
}
| {
title?: string | undefined;
url: string;
};
理論上,我們只要提供 url
或是 message
擇一就可以了,這邊有 bug。
嘗試了一陣子後,筆者參照了這篇 stackoverflow,再試試看幾種組合之後,發現以下這種寫法可以順利輸出
,也順道留言提供解法:
export const shareStoredRecords = async () => {
const message = await getAllStoredRecords();
try {
await Share.share({
message,
url: message,
});
} catch (error) {
console.error(error.message);
}
};
接著我們在 App.js
建立一個按鈕,其 onPress
的動作是執行 shareStoredRecords
:
筆者預計在正式環境保留一鍵刪除資料的功能。
原因在於如果我們已經輸出資料了,可以透過這個功能將本地的資料清空,避免將來重複輸出
。
但今天發現刪除所有儲存的資料之前,沒有確認的步驟,似乎有點危險。所以我們在 AnnoyancePrediction/src/asyncStorage.js
加入以下的 function 吧:
export const confirmClearAll = async () => {
Alert.alert('刪除資料', '確定是否要刪除嗎?', [
{
text: '取消',
style: 'cancel',
},
{text: '確認刪除!', onPress: clearAll, style: 'destructive'},
]);
};
然後讓我們回到 App.js
把原先按鈕對應的 clearAll
替換成 confirmClearAll
,如此在正式環境就不會不小心手殘刪除了!
今天的重頭戲,讓我們在手機裝上寫好的 app 來使用吧。
upload key
筆者使用的是 Macbook,依照此段指示建立:連結。
找到 JDK 的目錄,在該目錄底下用官網的指令生成 key。
生成的過程中,會問你密碼為何,這邊需要記下來,之後的步驟用得到,其他資訊為選填。
將這把 key 移到我們專案中 AnnoyancePrediction/android/app
底下
gradle.properties
.gradle
資料夾建立 gradle.properties
。路徑 /Users/<你的名字>/.gradle
。AnnoyancePrediction/android/gradle.properties
,因為這個檔案會被 git 追蹤,有資安風險。gradle.properties
,加入這四行:
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=<剛剛 key 填的密碼>
MYAPP_UPLOAD_KEY_PASSWORD=<剛剛 key 填的密碼>
Gradle config
android/app/build.gradle
,而不是 android/build.gradle
。...
為省略符號,不需要加入。AnnoyancePrediction/android
,在 terminal 輸入 ./gradlew bundleRelease
。npx react-native run-android --variant=release
。AnnoyancePrediction/android/app/build/outputs/apk/release
。接著我們透過雲端或是有線的方式,將 apk 檔傳到手機上安裝吧!
安裝完成後打開,首先碰到我們之前設置的背景執行限制詢問:
手機上的 UI:
背景有破圖。
通知順利在預期時間前 10 分鐘發出:
Icon 的部分沒有調整,為 React Native 預設的:
筆者發現我們目前記錄的功能,一天只能記錄一筆。若早上以及晚上都需要記錄,此功能將會不敷使用。
除此之外,UI 的部分,背景有破圖需要處理。
故我們新增 optional 的需求:
回顧一下 Day 23 總結的需求:
- 希望可以在關門前,可能前十分鐘,透過某個平台發出一個推播通知,告訴我可能樓下馬上準備要關門了
- 可以不斷累積新資料
- 如果可以,會希望有一個界面,可以快速增加開門聲的記錄
不過筆者會繼續寫下去,直到上述的 optional 的需求達成為止。
今天收工!